using System;
using System.Collections.Generic;
using System.Data;

using PMServiceDesk.DataType;
using PMServiceDesk.Utils.ManejoDatos;

namespace PMServiceDesk.DataAccess
{
    public class RecursoActividadData
    {
        #region Variables

        private string _select;
        private string _join;
        private string _where;
        private int _totalRegistros = 0;

        private Dictionary<string, object> _parametrosConsulta;

        #endregion

        #region Propiedades

        protected string Where
        {
            get
            {
                if (_where == "") return "";

                return "WHERE " + _where.Substring(3);
            }
        }

        #endregion

        #region Constructores

        public RecursoActividadData()
        {
            this._limpiarConsulta();
        }

        #endregion

        #region Metodos

        private void _limpiarConsulta()
        {
            _select = "";
            _join = "";
            _where = "";
            _parametrosConsulta = new Dictionary<string, object>();
        }

        private DataUtil _consultaDataReader(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            DataUtil data = null;

            if(paginaActual==0)
                data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, _select + _join + this.Where + orderBy,_parametrosConsulta);
            else
                data = DataReader.ReturnPagingReader(TypeDataBase.PMServiceDesk, _select, _join, this.Where, this._parametrosConsulta, paginaActual, cantidadMostrar, orderBy, ref _totalRegistros);

            this._limpiarConsulta();

            return data;
        }

        public void Grabar(RecursoActividadType recursoActividad)
        {
            using (DataUtil d = this._grabar())
            {
                d.AddParameter("@ID", (recursoActividad.Id == null ? "0" : recursoActividad.Id));
                d.AddParameter("@ACTIVIDADID", recursoActividad.ActividadId);
                d.AddParameter("@RECURSOID", recursoActividad.RecursoId);
                d.AddParameter("@CANTIDAD", recursoActividad.Cantidad);
                d.AddParameter("@PORCENTAJEUSO", recursoActividad.PorcentajeUso);

                recursoActividad.Id = d.ExecuteScalar(true).ToString();
            }
        }

        public void Eliminar(string id)
        {
            using (DataUtil d = this._eliminar())
            {
                d.AddParameter("@ID", id);

                d.ExecuteNonQuery();
            }
        }

        public RecursoActividadType Cargar()
        {
            List<RecursoActividadType> l = this.CargarLista();

            if (l.Count == 0) return null;

            return l[0];
        }

        public List<RecursoActividadType> CargarLista()
        {
            List<RecursoActividadType> l = new List<RecursoActividadType>();

            using (DataUtil d = this._consultaCargar())
                using (IDataReader r = d.ExecuteReader())
                {
                    RecursoActividadType o = null;

                    while (r.Read())
                    {
                        o = new RecursoActividadType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.ActividadId = r.GetValue(d.GetOrdinalReader("ACTIVIDADID")).ToString();
                        o.RecursoId = r.GetValue(d.GetOrdinalReader("RECURSOID")).ToString();
                        o.Recurso = r.GetValue(d.GetOrdinalReader("RECURSO")).ToString();
                        o.TipoCosto = r.GetValue(d.GetOrdinalReader("TIPOCOSTO")).ToString();
                        o.TipoRecurso = r.GetValue(d.GetOrdinalReader("TIPORECURSO")).ToString();
                        o.Cantidad = Convert.ToInt32(r.GetValue(d.GetOrdinalReader("CANTIDAD")));
                        o.PorcentajeUso = Convert.ToDecimal(r.GetValue(d.GetOrdinalReader("PORCENTAJEUSO")));

                        l.Add(o);
                    }
                }

            return l;
        }

        public List<RecursoActividadType> CargarListaVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            List<RecursoActividadType> l = new List<RecursoActividadType>();

            using (DataUtil d = this._consultaCargarVista(paginaActual, cantidadMostrar,orderBy))
                using (IDataReader r = d.ExecuteReader())
                {
                    RecursoActividadType o = null;

                    while (r.Read())
                    {
                        o = new RecursoActividadType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.ActividadId = r.GetValue(d.GetOrdinalReader("ACTIVIDADID")).ToString();
                        o.RecursoId = r.GetValue(d.GetOrdinalReader("RECURSOID")).ToString();
                        o.Recurso = r.GetValue(d.GetOrdinalReader("RECURSO")).ToString();
                        o.TipoCosto = r.GetValue(d.GetOrdinalReader("TIPOCOSTO")).ToString();
                        o.TipoRecurso = r.GetValue(d.GetOrdinalReader("TIPORECURSO")).ToString();
                        o.Cantidad = Convert.ToInt32(r.GetValue(d.GetOrdinalReader("CANTIDAD")));
                        o.PorcentajeUso = Convert.ToDecimal(r.GetValue(d.GetOrdinalReader("PORCENTAJEUSO")));

                        l.Add(o);
                    }
                }

            if (l.Count < _totalRegistros) l.Capacity = _totalRegistros;

            return l;
        }

        public List<RecursoActividadType> CargarLineaBasePorCodigoCuenta(string proyectoId, string codigoCuenta)
        {
            _parametrosConsulta.Add("@PROYECTOID", proyectoId);
            _parametrosConsulta.Add("@CODIGOCUENTA", codigoCuenta);

            List<RecursoActividadType> l = new List<RecursoActividadType>();

            using (DataUtil d = this._cargarLineaBasePorCodigoCuenta())
            using (IDataReader r = d.ExecuteReader())
            {
                RecursoActividadType o = null;

                while (r.Read())
                {
                    o = new RecursoActividadType();

                    o.Id = "0";
                    o.Recurso = r.GetValue(d.GetOrdinalReader("RECURSO")).ToString();
                    o.TipoCosto = r.GetValue(d.GetOrdinalReader("TIPOCOSTO")).ToString();
                    o.TipoRecurso = r.GetValue(d.GetOrdinalReader("TIPORECURSO")).ToString();
                    o.CostoTotal = ConvertFormat.Char_To_Decimal(r.GetValue(d.GetOrdinalReader("COSTOTOTAL")));

                    l.Add(o);
                }
            }

            return l;
        }

        #endregion

        #region SQL

        private DataUtil _grabar()
        {
            string sql = @"IF(NOT EXISTS(SELECT 1 FROM RECURSOACTIVIDAD WHERE ID=@ID)) 
                           BEGIN
                               INSERT INTO RECURSOACTIVIDAD
                               (
                                   ACTIVIDADID
                                  ,RECURSOID
                                  ,CANTIDAD
                                  ,PORCENTAJEUSO
                               )
                               VALUES
                               (
                                   @ACTIVIDADID
                                  ,@RECURSOID
                                  ,@CANTIDAD
                                  ,@PORCENTAJEUSO
                               )

                               SELECT @@IDENTITY
                           END
                           ELSE
                           BEGIN
                               UPDATE RECURSOACTIVIDAD SET
                               ACTIVIDADID=@ACTIVIDADID
                              ,RECURSOID=@RECURSOID
                              ,CANTIDAD=@CANTIDAD
                              ,PORCENTAJEUSO=@PORCENTAJEUSO
                               WHERE ID=@ID

                               SELECT @ID
                           END";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _eliminar()
        {
            string sql = @"DELETE FROM RECURSOACTIVIDAD WHERE ID=@ID";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _consultaCargar()
        {
            _select = @"SELECT
                        RE.ID
                       ,RE.ACTIVIDADID
                       ,RE.RECURSOID
                       ,REC.NOMBRE                                  [RECURSO]
                       ,TIPREC.NOMBRE								[TIPORECURSO]
                       ,TIPCOS.NOMBRE								[TIPOCOSTO]
                       ,RE.CANTIDAD
                       ,RE.PORCENTAJEUSO
                        ";

            _join = @"FROM DBO.RECURSOACTIVIDAD [RE] 
                    INNER JOIN RECURSO [REC] ON REC.ID = RE.ID
	                INNER JOIN PARAMETRO [TIPREC] ON TIPREC.ID=REC.TIPORECURSOID
	                INNER JOIN PARAMETRO [TIPCOS] ON TIPCOS.ID=REC.TIPOCOSTOID    
                      ";

            return this._consultaDataReader();
        }

        private DataUtil _consultaCargarVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _select = @"SELECT
                        RE.ID
                       ,RE.ACTIVIDADID
                       ,RE.RECURSOID
                       ,REC.NOMBRE                                  [RECURSO]
                       ,TIPREC.NOMBRE								[TIPORECURSO]
                       ,TIPCOS.NOMBRE								[TIPOCOSTO]
                       ,RE.CANTIDAD
                       ,RE.PORCENTAJEUSO
                        ";

            _join = @"FROM DBO.RECURSOACTIVIDAD [RE] 
                    INNER JOIN RECURSO [REC] ON REC.ID = RE.ID
	                INNER JOIN PARAMETRO [TIPREC] ON TIPREC.ID=REC.TIPORECURSOID
	                INNER JOIN PARAMETRO [TIPCOS] ON TIPCOS.ID=REC.TIPOCOSTOID    
                      ";

            return this._consultaDataReader(paginaActual, cantidadMostrar, orderBy);
        }

        private DataUtil _cargarLineaBasePorCodigoCuenta()
        {
            string sql = @" SELECT 
	                        (CASE REC.TIPORECURSOID
		                        WHEN 9 THEN --RECURSO TIPO HUMANO
			                        REC.DOCUMENTOIDENTIDAD + ' - ' + REC.NOMBRE
		                        ELSE
			                        REC.NOMBRE	
	                        END)										[RECURSO]
	                        ,TIPREC.NOMBRE								[TIPORECURSO]
	                        ,TIPCOS.NOMBRE								[TIPOCOSTO]
	                        ,SUM
	                        (
		                        DBO.FN_CALCULAR_BAC
		                        (
			                        REC.TIPOCOSTOID
			                        ,REC.COSTO
			                        ,RECACT.PORCENTAJEUSO
			                        ,RECACT.CANTIDAD
			                        ,REC.CALENDARIOID
			                        ,ACT.FECHAINICIO
			                        ,ACT.FECHAFIN
		                        )
	                        )											[COSTOTOTAL]
                            FROM PAQUETETRABAJO [PAQTRA] 
                            INNER JOIN ACTIVIDAD [ACT] ON ACT.PAQUETETRABAJOID = PAQTRA.ID
                            INNER JOIN RECURSOACTIVIDAD [RECACT] ON RECACT.ACTIVIDADID = ACT.ID
                            INNER JOIN RECURSO [REC] ON REC.ID = RECACT.ID
	                        INNER JOIN PARAMETRO [TIPREC] ON TIPREC.ID=REC.TIPORECURSOID
	                        INNER JOIN PARAMETRO [TIPCOS] ON TIPCOS.ID=REC.TIPOCOSTOID    
	                        WHERE PAQTRA.PROYECTOID=@PROYECTOID
	                        AND SUBSTRING(PAQTRA.CODIGOCUENTA,1,LEN(@CODIGOCUENTA)) = @CODIGOCUENTA
	                        GROUP BY
	                        (CASE REC.TIPORECURSOID
		                        WHEN 9 THEN --RECURSO TIPO HUMANO
			                        REC.DOCUMENTOIDENTIDAD + ' - ' + REC.NOMBRE
		                        ELSE
			                        REC.NOMBRE	
	                        END)						
	                        ,TIPREC.NOMBRE				
	                        ,TIPCOS.NOMBRE";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql, this._parametrosConsulta);
        }

        public void FiltrarPorId(string id)
        {
            _where += @"AND RE.ID=@ID
                                 ";

            _parametrosConsulta.Add("@ID", id);
        }

        public void FiltrarPorActividadId(string actividadId)
        {
            _where += @"AND RE.ACTIVIDADID=@ACTIVIDADID
                                 ";

            _parametrosConsulta.Add("@ACTIVIDADID", actividadId);
        }

        #endregion
    }
}
